/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function (nums) {
  //保存所有排列路径的数组 当前排列路径 标记数组nums的每个元素是否被使用
  const result = []
  const path = []
  const used = new Array(nums.length).fill(false)

  // 定义一个递归函数：计算所有的排列路径
  function backTrack() {
    //如果当前排列路径的长度和数组nums的长度相等，说明当前排列路径已完整：放入数组result，返回
    if (path.length === nums.length) {
      result.push([...path])//必须用展开符... ，因为需要拷贝当前 path 的一个快照
      return
    }
    //遍历一遍数组元素
    for (let i = 0; i < nums.length; i++) {
      //如果当前元素未使用
      if (!used[i]) {
        // 将当前元素nums[i]加入当前排列路径path，标记该元素为已使用
        path.push(nums[i])
        used[i] = true
        //继续调用递归函数
        backTrack()
        //递归完毕：将当前元素nums[i]弹出当前排列路径path，标记该元素为未使用
        path.pop()
        used[i] = false
      }
    }
  }
  //调用递归函数
  backTrack()
  //返回数组result
  return result
};
console.log(permute([1, 2, 3]))